<!-- Copyright (C) 2019-2021 Junruoyu Zheng. Home page: https://junruoyu-zheng.gitee.io/ligral

     Distributed under MIT license.
     See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-->
<!DOCTYPE html>
<html lang="en">
 <head>
  <title>
   用户文档
  </title>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/>
  <!-- Main CSS -->
  <link href="/ligral/css/style.css" rel="stylesheet"/>
  <link href="/ligral/css/rolling.css" rel="stylesheet"/>
  <link href="/ligral/css/custom.css" rel="stylesheet"/>
  <link href="/ligral/css/katex.min.css" rel="stylesheet"/>
  <link href="/ligral/avatar.png" rel="shortcut icon" type="image/x-icon"/>
  <!-- Font Awesome -->
  <script crossorigin="anonymous" src="https://kit.fontawesome.com/14294c79e2.js">
  </script>
 </head>
 <body>
  <!-- Header -->
  <div class="header-wrap d-none d-md-block">
   <div class="container">
    <div class="row">
     <!-- Left header box -->
     <header class="col-6 text-left">
      <h1 class="letter-wrap title">
       Ligral
      </h1>
     </header>
    </div>
   </div>
  </div>
  <!-- Main navigation -->
  <nav class="navbar navbar-expand-md navbar-dark bg-primary">
   <div class="container">
    <!-- Company name shown on mobile -->
    <a class="navbar-brand d-md-none d-lg-none d-xl-none" href="#">
     Ligral
    </a>
    <!-- Mobile menu toggle -->
    <button aria-controls="mainNavbar" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler" data-target="#mainNavbar" data-toggle="collapse" type="button">
     <span class="navbar-toggler-icon">
     </span>
    </button>
    <!-- Main navigation items -->
    <div class="collapse navbar-collapse" id="mainNavbar">
     <ul class="navbar-nav mr-auto">
      <li class="nav-item">
       <a class="nav-link" href="/ligral/index.html">
        主页
        <span class="sr-only">
         (current)
        </span>
       </a>
      </li>
      <li class="nav-item dropdown active">
       <a aria-expanded="false" aria-haspopup="true" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">
        文档
       </a>
       <div class="dropdown-menu navbar-dark bg-primary">
        <a class="dropdown-item" href="/ligral/quick-start.html">
         快速开始
        </a>
        <a class="dropdown-item" href="/ligral/user-guide">
         用户文档
        </a>
        <a class="dropdown-item" href="/ligral/dev-guide">
         开发文档
        </a>
        <a class="dropdown-item" href="/ligral/interface/">
         接口定义
        </a>
       </div>
      </li>
      <!-- <li class="nav-item">
                                <a class="nav-link" href="#">Services</a>
                        </li> -->
      <li class="nav-item">
       <a class="nav-link" href="/ligral/product.html">
        产品
       </a>
      </li>
      <li class="nav-item">
       <a class="nav-link" href="/ligral/contact.html">
        联系我们
       </a>
      </li>
     </ul>
     <!-- <form class="form-inline header-search-form my-2 my-lg-0">
                        <input class="form-control mr-sm-2" type="text" size="10"  placeholder="Search" aria-label="Search">
                        <button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
                    </form> -->
    </div>
   </div>
  </nav>
  <!-- Jumbtron / Slider -->
  <!-- Main content area -->
  <main class="container">
   <div class="row" style="flex-direction: row-reverse;">
    <!-- Main content -->
    <div class="col-sm-8">
     <article>
      <h1>
       用户文档
      </h1>
      <p>
       “纸上得来终觉浅，绝知此事要躬行。”如果您刚刚开始了解这个项目，还没有看过
       <a href="../quick-start">
        快速开始
       </a>
       的话，建议您先按照快速开始安装 ligral 并试着运行。Ligral 的语法和常见语言（C 和从 C 衍生出来语言，包括 Java、python 等等，函数式语言，SQL 语言，modelica 语言等等）的语法均不同，需要实操才能理解和熟悉。
      </p>
      <p>
       正式开始熟悉 ligral 的用法之前，先了解 ligral 的目标似乎很有必要。您可能需要知道 ligral 是用来解决什么问题的，它具体做的是什么事。接着，如果您先前已经在使用另一款工具做着相同的事，您可能还感兴趣 ligral 提出了什么新思路，解决了什么痛点，具备哪些优势，而又可能带来哪些劣势。
      </p>
      <h3>
       Ligral 的目标
      </h3>
      <p>
       Ligral 这个概念同时指代 ligral 语言及其解释器/编译器（目前仅实现了解释器）。
      </p>
      <p>
       对于 ligral 语言，它的目标是简洁高效地描述仿真模型。如果您用 C 语言来描述模型，您可能关注的是算法；如果您用 modelica 语言来描述模型，您可能关注的是公式；而如果您用 ligral 语言来描述模型，您可能关注的是结构，正如您使用 Simulink 来描述仿真模型时一样。
      </p>
      <p>
       我们不得不承认，在描述仿真模型时，对比 C 语言甚至 modelica 语言，Simulink 是更加高效的。一方面，Simulink 之间描述了模块之间的连接关系，而不是背后的逻辑关系。另一方面，图形化界面也让这种关系更加直观。而 ligral 语言描述的也正是模块之间的连接关系，同时，它也通过文本的形式尽可能地还原图形界面的直观。
      </p>
      <p>
       所以 ligral 语言所做的事就是：
      </p>
      <ul>
       <li>
        定义、声明、描述模块；
       </li>
       <li>
        描述模块之间的连接关系；从而
       </li>
       <li>
        描述整个仿真模型。
       </li>
      </ul>
      <p>
       最终，ligral 语言所能提供的就是两个函数：
      </p>
      <p>
       <span class="katex-display">
        <span class="katex">
         <span class="katex-mathml">
          <math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
           <semantics>
            <mrow>
             <mover accent="true">
              <mi>
               x
              </mi>
              <mo>
               ˙
              </mo>
             </mover>
             <mo>
              =
             </mo>
             <mi>
              f
             </mi>
             <mo stretchy="false">
              (
             </mo>
             <mi>
              x
             </mi>
             <mo separator="true">
              ,
             </mo>
             <mi>
              u
             </mi>
             <mo separator="true">
              ,
             </mo>
             <mi>
              t
             </mi>
             <mo stretchy="false">
              )
             </mo>
             <mspace linebreak="newline">
             </mspace>
             <mi>
              y
             </mi>
             <mo>
              =
             </mo>
             <mi>
              g
             </mi>
             <mo stretchy="false">
              (
             </mo>
             <mi>
              x
             </mi>
             <mo separator="true">
              ,
             </mo>
             <mi>
              u
             </mi>
             <mo separator="true">
              ,
             </mo>
             <mi>
              t
             </mi>
             <mo stretchy="false">
              )
             </mo>
            </mrow>
            <annotation encoding="application/x-tex">
             \dot{x}=f(x,u,t)\\
y=g(x,u,t)
            </annotation>
           </semantics>
          </math>
         </span>
         <span aria-hidden="true" class="katex-html">
          <span class="base">
           <span class="strut" style="height:0.66786em;vertical-align:0em;">
           </span>
           <span class="mord accent">
            <span class="vlist-t">
             <span class="vlist-r">
              <span class="vlist" style="height:0.66786em;">
               <span style="top:-3em;">
                <span class="pstrut" style="height:3em;">
                </span>
                <span class="mord">
                 <span class="mord mathnormal">
                  x
                 </span>
                </span>
               </span>
               <span style="top:-3em;">
                <span class="pstrut" style="height:3em;">
                </span>
                <span class="accent-body" style="left:-0.11111000000000001em;">
                 <span class="mord">
                  ˙
                 </span>
                </span>
               </span>
              </span>
             </span>
            </span>
           </span>
           <span class="mspace" style="margin-right:0.2777777777777778em;">
           </span>
           <span class="mrel">
            =
           </span>
           <span class="mspace" style="margin-right:0.2777777777777778em;">
           </span>
          </span>
          <span class="base">
           <span class="strut" style="height:1em;vertical-align:-0.25em;">
           </span>
           <span class="mord mathnormal" style="margin-right:0.10764em;">
            f
           </span>
           <span class="mopen">
            (
           </span>
           <span class="mord mathnormal">
            x
           </span>
           <span class="mpunct">
            ,
           </span>
           <span class="mspace" style="margin-right:0.16666666666666666em;">
           </span>
           <span class="mord mathnormal">
            u
           </span>
           <span class="mpunct">
            ,
           </span>
           <span class="mspace" style="margin-right:0.16666666666666666em;">
           </span>
           <span class="mord mathnormal">
            t
           </span>
           <span class="mclose">
            )
           </span>
          </span>
          <span class="mspace newline">
          </span>
          <span class="base">
           <span class="strut" style="height:0.625em;vertical-align:-0.19444em;">
           </span>
           <span class="mord mathnormal" style="margin-right:0.03588em;">
            y
           </span>
           <span class="mspace" style="margin-right:0.2777777777777778em;">
           </span>
           <span class="mrel">
            =
           </span>
           <span class="mspace" style="margin-right:0.2777777777777778em;">
           </span>
          </span>
          <span class="base">
           <span class="strut" style="height:1em;vertical-align:-0.25em;">
           </span>
           <span class="mord mathnormal" style="margin-right:0.03588em;">
            g
           </span>
           <span class="mopen">
            (
           </span>
           <span class="mord mathnormal">
            x
           </span>
           <span class="mpunct">
            ,
           </span>
           <span class="mspace" style="margin-right:0.16666666666666666em;">
           </span>
           <span class="mord mathnormal">
            u
           </span>
           <span class="mpunct">
            ,
           </span>
           <span class="mspace" style="margin-right:0.16666666666666666em;">
           </span>
           <span class="mord mathnormal">
            t
           </span>
           <span class="mclose">
            )
           </span>
          </span>
         </span>
        </span>
       </span>
      </p>
      <p>
       有了这两个函数，求解器自己维护一个状态列表，就可以根据输入计算输出，从而完成仿真。
      </p>
      <p>
       而 ligral 解释器/编译器所实现的，除了解析 ligral 语言之外，更重要的就是提供了一系列的求解器（目前仅有定步长欧拉求解器），能求解 ligral 语言所描述的仿真问题。与此同时，ligral 还提供了一系列工具箱，用以处理输入输出的数据传输。
      </p>
      <h3>
       Ligral 的优势
      </h3>
      <p>
       Ligral 区别于市面上常见的仿真工具，最大的不同就在于它本身是一个文本语言，但是又具备图形语言的直观性。表示模块之间的连接时，ligral 并不像 modelica 那样使用一个
       <code>
        connect
       </code>
       函数（modelica 这么做是为了让语言更强大，能表示更多的逻辑），而是用
       <code>
        -&gt;
       </code>
       符号模拟图形语言中的箭头，从而让用户很直观地看出模块之间的关系。
      </p>
      <p>
       Ligral 在可读性和简洁性的设计上进行了一番革新。除了上面说的箭头符号之外，ligral 还引入了“声明 - 引用”系统，作为一个内建的功能，而非像 Simulink 中一样用模块来实现。这让模块的声明和引用变得十分简单高效。允许模块先声明后引用，也极大程度地保证了连接图部分的简洁与清晰。此外，Ligral 传参的语法参考了 JSON，这让传参变得简单。
      </p>
      <p>
       文本语言经过长年的发展，语法高亮、智能语法提示（尚待开发）等技术以及大大降低文本语言的门槛，在编码速度和效率上以及能比肩甚至超越图形语言。没有 GUI 这个负担，ligral 语言甚至可以在直接下位机开发、编写，在本地编译、部署，免去了从上位机下载的麻烦。
      </p>
      <p>
       Ligral 的另一项重大革新则是引入了面向对象的思想，包括类和对象、接口和继承等等。当您定义了一些模块及其相互连接关系，您实际上定义的是一个部件或者一个系统，这些部件或系统有可能在更大的工程里充当一个节点。这些功能可能是需要复用的，而且可能随着一些参数的改变而略有不同。因此，ligral 提供了“路由”这一概念，这对等于 C++ 等面向对象的语言中的类。类似地，您可以从这些“类”（也就是路由）声明他们的实例，并传入参数。Simulink 中虽然也有 Reference Model 等可以复用逻辑的功能，但是最常用的 Subsystem 并没有类的概念，您改动一个（复制粘贴得到的）副本之后其他副本并不会改动。
      </p>
      <p>
       而接口的思想更是 ligral 所独有的。在仿真中，您可能发现有一些部件经常需要更换，比如您设计了一系列控制器，想要应用到同样的模型上，或者有很多被控对象，需要检验控制器的鲁棒性，被控对象和控制器之间的接口可能是固定的。如对控制器而言，系统状态作为输入，控制信号作为输出，被控对象则相反。那么，您可以针对这些输入输出设计接口，让控制器和被控对象分别继承各自的接口，这样它们之间的相互替换就是安全的。Ligral 提供了“签名”这一概念，这对等于 C#、Java 等面向对象的语言中的接口，也和函数的签名有共通之处。之所以区别于“接口”，是因为在 C#、Java 中，一个类能继承多个接口;而在 ligral 中，一个路由只能有一个签名，签名声明了该路由的所有接口。
      </p>
      <p>
       在设计更大的仿真对象时，接口的概念尤为重要。比如您在设计汽车整车模型时，您可能会为发动机、悬架、离合器等等大的部件设计接口，通过这些接口把整车级和系统级的逻辑分离，从而降低代码的耦合性，让仿真模型变得清晰明了，避免了混乱和隐蔽的错误。后期进行技术升级时，就可以通过接口用新的部件替换旧的部件。
      </p>
      <p>
       综上所述，ligral 作为仿真语言中的新生力量，具备了许多传统语言不可比拟的优势。当然，ligral 目前肯定还存在不少劣势，比如开发不完全，生态不足等等。但我们坚信 ligral 会有一个光明的未来。为何不从现在开始了解它呢？
      </p>
     </article>
    </div>
    <!-- Sidebar -->
    <aside class="col-sm-4">
     <div class="sidebar-box">
      <h4>
       目录
      </h4>
      <div class="list-group list-group-root">
       <a class="list-group-item" href="/ligral/quick-start.html">
        快速开始
       </a>
       <a class="list-group-item active" href="/ligral/user-guide/index.html">
        用户文档
       </a>
       <div class="list-group">
        <a class="list-group-item" href="/ligral/user-guide/terms.html">
         术语定义
        </a>
        <a class="list-group-item" href="/ligral/user-guide/config.html">
         设置语句
        </a>
        <a class="list-group-item" href="/ligral/user-guide/const.html">
         声明常量
        </a>
        <a class="list-group-item" href="/ligral/user-guide/node.html">
         声明节点
        </a>
        <a class="list-group-item" href="/ligral/user-guide/link.html">
         节点连接
        </a>
        <a class="list-group-item" href="/ligral/user-guide/matrix.html">
         矩阵运算
        </a>
        <a class="list-group-item" href="/ligral/user-guide/route.html">
         路由类型
        </a>
        <a class="list-group-item" href="/ligral/user-guide/signature.html">
         接口签名
        </a>
        <a class="list-group-item" href="/ligral/user-guide/import.html">
         引用依赖
        </a>
       </div>
       <a class="list-group-item" href="/ligral/dev-guide/index.html">
        开发文档
       </a>
       <div class="list-group">
        <a class="list-group-item" href="/ligral/dev-guide/syntax.html">
         语法设计
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/interpreter.html">
         解释器
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/component.html">
         模块组件
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/simulation.html">
         问题抽象
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/tools.html">
         工具箱
        </a>
       </div>
       <a class="list-group-item" href="/ligral/interface/index.html">
        接口定义
       </a>
       <div class="list-group">
        <a class="list-group-item" href="/ligral/interface/model.html">
         模块接口
        </a>
        <a class="list-group-item" href="/ligral/interface/protocol.html">
         数据接口
        </a>
       </div>
      </div>
     </div>
     <div class="sidebar-box sidebar-box-bg">
      <h4>
       关于我们
      </h4>
      <p>
       我们是一群有志于突破工业软件封锁、具有开源精神的开发者。本项目旨在替代 Simulink 进行仿真，通过与框图等效的文本语言描述仿真对象，并解释/编译而后求解。
       <a class="readmore" href="https://gitee.com/junruoyu-zheng/ligral/wikis" target="_blank">
        更多 »
       </a>
      </p>
     </div>
     <div class="sidebar-box">
      <h4>
       仓库链接
      </h4>
      <ul>
       <li>
        <a href="https://gitee.com/junruoyu-zheng/ligral" target="_blank" title="Gitee">
         Gitee 仓库
        </a>
       </li>
       <li>
        <a href="https://github.com/JRY-Zheng/ligral" target="_blank" title="GitHub">
         GitHub 仓库
        </a>
       </li>
      </ul>
     </div>
    </aside>
   </div>
  </main>
  <!-- Footer -->
  <footer class="footer">
   <div class="footer-lists">
    <div class="container">
     <div class="row">
      <div class="col-sm">
       <ul>
        <li>
         <h4>
          联系我们
         </h4>
        </li>
        <li>
         <a href="mailto:zhengjry@outlook.com">
          给我们发邮件
         </a>
        </li>
        <li>
         <a href="https://www.zhihu.com/people/LostFish" target="_blank">
          来知乎关注我
         </a>
        </li>
        <li>
         <a href="https://web.okjike.com/u/105ad022-f646-48c0-8236-6007ee5179c5" target="_blank">
          来即刻关注我
         </a>
        </li>
       </ul>
      </div>
      <div class="col-sm">
       <ul>
        <li>
         <h4>
          代码仓库
         </h4>
        </li>
        <li>
         <a href="https://gitee.com/junruoyu-zheng/ligral" target="_blank">
          Gitee 仓库
         </a>
        </li>
        <li>
         <a href="https://github.com/JRY-Zheng/ligral" target="_blank">
          GitHub 仓库
         </a>
        </li>
       </ul>
      </div>
      <div class="col-sm">
       <ul>
        <li>
         <h4>
          合作伙伴
         </h4>
        </li>
        <li>
         <a href="http://pyminer.com" target="_blank">
          PyMiner 官网
         </a>
        </li>
        <li>
         <a href="https://gitee.com/py2cn/pyminer" target="_blank">
          PyMiner 仓库地址
         </a>
        </li>
       </ul>
      </div>
      <div class="col-sm">
       <h4>
        致谢
       </h4>
       <p>
        Ligral 的开发得到了很多帮助，特在此致谢！感谢我的单位对创新的鼓励；感谢我的导师 James 对数值积分的指导；感谢 Gitee 对项目的支持，在刚开源不久就为我推荐；感谢 PyMiner 开发团队对我的鼓励和支持！
       </p>
       <p class="social-icons">
        <a href="https://gitee.com/junruoyu-zheng/ligral/stargazers" style="text-decoration: none;" target="_blank">
         <img alt="star" src="https://gitee.com/junruoyu-zheng/ligral/badge/star.svg?theme=dark"/>
        </a>
        <a href="https://www.zhihu.com/people/LostFish" target="_blank">
         <i class="fab fa-zhihu fa-2x zhihu-icon">
         </i>
        </a>
       </p>
      </div>
     </div>
    </div>
   </div>
   <div class="footer-bottom">
    <p class="text-center">
     Copyright © 2021. Ligral All rights reserved. 梨果科技版权所有 © 2021
    </p>
    <p class="text-center">
     <a href="#">
      <i class="fa fa-arrow-up">
      </i>
      回到顶部
     </a>
    </p>
   </div>
  </footer>
  <!-- Bootcamp JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  <script src="/ligral/js/jquery-3.2.1.slim.min.js">
  </script>
  <script src="/ligral/js/popper.min.js">
  </script>
  <script src="/ligral/js/bootstrap.min.js">
  </script>
  <script src="/ligral/js/TweenMax.min.js">
  </script>
  <script src="/ligral/js/rolling.js">
  </script>
 </body>
</html>